òɾۿûѧϰʹá
ԭַhttps://www.joinquant.com/post/15100

ԭһ˵ʽ鵽ԭĺ߽ۡ


ԭĲԴ£

def initialize(context):
    """ʼ"""
    
    # СֵƱ
    g.stocksnum = 10
    # ֶƵ
    g.period = 10
    # ¼Խеڼ
    g.days = 0 
    # ѭdaily
    run_daily(daily,time='every_bar')
    

def daily(context):
    """׺"""
    
    # ÿһһ
    g.days += 1
    # жϲԽǷֶܱƵ1
    if g.days % g.period != 1:
        return

    # ȡǰʱ
    date=context.current_dt.strftime("%Y-%m-%d")
    # ȡָָ֤֤ĳɷֹɴ벢ӣΪȫAгйƱ
    # ƱزȫΪ·͹Ʊ֣Ҫ̬ȡƱ
    scu = get_index_stocks('000001.XSHG') + get_index_stocks('399106.XSHE')

    # ѡscuڵĹƱĹƱ룬յǰʱֵС
    df = get_fundamentals(query(
            valuation.code,
            valuation.market_cap
        ).filter(
            valuation.code.in_(scu)
        ).order_by(
            valuation.market_cap.asc()
        ), date=date
        )

    # ȡǰg.stocksnumĹƱ룬תlistͣbuylistΪѡеĹƱ
    buylist =list(df['code'][:g.stocksnum])

    # ÿ³еĹƱжϣǷѾbuylist
    for stock in context.portfolio.positions:
        if stock not in buylist: #stockbuylist
            order_target(stock, 0) #stockĳֲΪ0

    # ѾֲֵĲٱ
    buy_list = list(set(buylist) - set(context.portfolio.positions.keys()))
    # ͣƵĹƱ
    current_data = get_current_data()
    buy_list = [stock for stock in buylist if not current_data[stock].paused]
    # ûҪĹƱͷ
    if len(buy_list) <= 0:
        return
    # ʽֳg.stocksnum
    position_per_stk = context.portfolio.cash/len(buy_list)
    # position_per_stkСg.stocksnumʽȥbuylistеĹƱ
    for stock in buy_list:
        order_value(stock, position_per_stk)
    